package cn.modoumama.common;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.support.RequestContext;

import cn.modoumama.common.utils.StringUtils;
import cn.modoumama.page.Page;

/** 
 * 类描述：常用工具类<br>
 * <br/>
 * 创建人：邓强   <br>
 * 创建时间：2017年11月23日 下午12:22:48    <br> 
 * 修改人：  <br>
 * 修改时间：2017年11月23日 下午12:22:48   <br>  
 * 修改备注：     <br>
 * @version   V1.0      
 */
public class RequestUtils {
protected Logger logger = LoggerFactory.getLogger(getClass());
	
	/**
	 * IP校验正则串
	 */
	public static final String IP_REGEX = "^((([1-9]|[1-9][0-9]|1\\d\\d|2[0-4]\\d|25[0-5])))\\.((([0-9]|[1-9][0-9]|1\\d\\d|2[0-4]\\d|25[0-5])))\\.((([0-9]|[1-9][0-9]|1\\d\\d|2[0-4]\\d|25[0-5]))|\\*)\\.((([0-9]|[1-9][0-9]|1\\d\\d|2[0-4]\\d|25[0-5]))|\\*)$";
	// \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔),  
	// 字符串在编译时会被转码一次,所以是 "\\b"  
	// \B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔)  
	public static String phoneReg = "\\b(ip(hone|od)|android|opera m(ob|in)i"  
	        +"|windows (phone|ce)|blackberry"  
	        +"|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp"  
	        +"|laystation portable)|nokia|fennec|htc[-_]"  
	        +"|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";  
	public static String tableReg = "\\b(ipad|tablet|(Nexus 7)|up.browser"  
	        +"|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";  
	public static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE);  
	public static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE);  
	
	
	/**
	 * 获取请求ip(注意不能异步使用)<br>
	 * <br>
	 * 创建人：邓强 <br>
	 * 创建时间：2017年10月30日 上午10:38:59 <br>
	 * 修改人： <br>
	 * 修改时间：2017年10月30日 上午10:38:59 <br>
	 * 修改备注： <br>
	 * 
	 * @param request
	 * @return
	 */
	public static String getRemoteIp(HttpServletRequest request) {
		String ip = request.getHeader("x-forwarded-for");

		if (ip == null || "".equals(ip.trim()) || "unknown".equalsIgnoreCase(ip.trim())) {
			ip = request.getHeader("Proxy-Client-IP");
		} else {
			ip = ip.trim().replaceAll("\\s", "");

			String[] ipList = ip.split(",");

			for (int i = 0; i < ipList.length; i++) {
				if (!ipList[i].equalsIgnoreCase("unknown") && ipList[i].matches(IP_REGEX)) {
					ip = ipList[i];
					break;
				}
			}
		}

		if (ip == null || "".equals(ip.trim()) || "unknown".equalsIgnoreCase(ip.trim())) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}

		if (ip == null || "".equals(ip.trim()) || "unknown".equalsIgnoreCase(ip.trim())) {
			ip = request.getRemoteAddr();
		}

		return ip;
	}

	/**
	 * 判断是否get请求<br>
	 * <br>  
	 * 创建人：邓强   <br>
	 * 创建时间：2017年10月30日 上午10:39:37    <br> 
	 * 修改人：  <br>
	 * 修改时间：2017年10月30日 上午10:39:37   <br>  
	 * 修改备注：     <br> 
	 * @param request
	 * @return
	 */
	public static boolean isGet(HttpServletRequest request) {
		return "GET".equalsIgnoreCase(request.getMethod());
	}

	/**
	 * 判断是否微信浏览器<br>
	 * <br>  
	 * 创建人：邓强   <br>
	 * 创建时间：2017年10月30日 上午10:39:50    <br> 
	 * 修改人：  <br>
	 * 修改时间：2017年10月30日 上午10:39:50   <br>  
	 * 修改备注：     <br> 
	 * @param request
	 * @return
	 */
	public static boolean isWxBrowser(HttpServletRequest request) {
		String userAgent = request.getHeader("user-agent");
		if (userAgent != null && userAgent.toLowerCase().indexOf("micromessenger") > 0) {
			return true;
		}
		return false;
	}
	
	/**
	 * 是否ajax请求<br>
	 * <br>  
	 * 创建人：邓强   <br>
	 * 创建时间：2017年10月30日 上午10:40:02    <br> 
	 * 修改人：  <br>
	 * 修改时间：2017年10月30日 上午10:40:02   <br>  
	 * 修改备注：     <br> 
	 * @param request
	 * @return
	 */
	public static boolean isAjax(HttpServletRequest request) {
		return request.getHeader("x-requested-with") != null
				&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest");
	}
	
	
	  
	public static boolean checkMobile(HttpServletRequest request){ 
		String userAgent = request.getHeader( "USER-AGENT" ).toLowerCase();  
		  
		if(null == userAgent){  
		    userAgent = "";  
		}
	    // 匹配  
	    Matcher matcherPhone = phonePat.matcher(userAgent);  
	    Matcher matcherTable = tablePat.matcher(userAgent);  
	    if(matcherPhone.find() || matcherTable.find()){  
	        return true;  
	    } else {
	        return false;  
	    }  
	}
	
	/**
	 *
	 * @param request
	 * @return
	 * @throws BusinessException
	 */
	public static Page getPage(HttpServletRequest request){
		return getPage(request,null);
	}

	/**
	 * 按条件筛选，当orderByClause传入规则时，强制使用该规则，会过滤掉request的排序<br>
	 * <br>  
	 * 创建人：邓强   <br>
	 * 创建时间：2017年12月5日 上午11:49:57    <br> 
	 * 修改人：  <br>
	 * 修改时间：2017年12月5日 上午11:49:57   <br>  
	 * 修改备注：     <br> 
	 * @param request
	 * @param orderByClause
	 * @return
	 */
	public static Page getPage(HttpServletRequest request, String orderByClause){
		Page pageObject = new Page();
		String currPageStr = request.getParameter("page");
		String pageSizeStr = request.getParameter("rows");
		String property = request.getParameter("sort");
		if (StringUtils.isEmpty(orderByClause)) {
			if (!StringUtils.isEmpty(property)) {
				orderByClause = getColumn(property) + " "
						+ request.getParameter("order");
			}
		}
		try{
			pageObject.setCurrPage(Integer.valueOf(currPageStr));
			pageObject.setPageSize(Integer.valueOf(pageSizeStr));
		}catch(NumberFormatException e){
			pageObject.setCurrPage(1);
			pageObject.setPageSize(Integer.MAX_VALUE);
		}
		pageObject.addCondition("orderByClause", orderByClause);
		return pageObject;
	}
	
	/**
	 * 按条件筛选，当没有request里没有排序时，使用默认排序<br>
	 * <br>  
	 * 创建人：邓强   <br>
	 * 创建时间：2017年12月5日 上午11:48:49    <br> 
	 * 修改人：  <br>
	 * 修改时间：2017年12月5日 上午11:48:49   <br>  
	 * 修改备注：     <br> 
	 * @param request
	 * @param orderByClause
	 * @return
	 */
	public static Page getOrderPage(HttpServletRequest request, String orderByClause){
		if(StringUtils.isBlank(orderByClause)){
			throw new RuntimeException("必须传入排序规则");
		}
		
		Page pageObject = new Page();
		String currPageStr = request.getParameter("page");
		String pageSizeStr = request.getParameter("rows");
		String property = request.getParameter("sort");
		if (StringUtils.isNotBlank(property)) {
			orderByClause = getColumn(property) + " " + request.getParameter("order");
		}
		try{
			pageObject.setCurrPage(Integer.valueOf(currPageStr));
			pageObject.setPageSize(Integer.valueOf(pageSizeStr));
		}catch(NumberFormatException e){
			pageObject.setCurrPage(1);
			pageObject.setPageSize(Integer.MAX_VALUE);
		}
		pageObject.addCondition("orderByClause", orderByClause);
		return pageObject;
	}

	public static String getColumn(String property) {
		StringBuffer buffer = new StringBuffer(property);
		for (int i = 0; i < buffer.length(); i++) {
			char c = buffer.charAt(i);
			if(Character.isUpperCase(c)){
				buffer.insert(i++, '_');
			}
		}
		return buffer.toString();
	}
	
	public static void setTitle(HttpServletRequest request, String key) {
		// 从后台代码获取国际化信息
		RequestContext requestContext = new RequestContext(request);
		request.setAttribute("title", requestContext.getMessage(key));
	}
}
